package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.Profesor;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class DAOProfesor {

    public final String TABLA_PROFESOR = "profesores";
    public final String COLUMNA_CLAVE_PROFESOR = "claveProfesor";
    public final String COLUMNA_NOMBRE = "nombre";
    public final String COLUMNA_APELLIDO = "apellido";
    public final String COLUMNA_GRADO_ACADEMICO = "gradoAcademico";
    private Connection conexion = null;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();

    public DAOProfesor() {
        this.conexion = this.acceso.abrirConexion();
    }

    public void cerrarConexionAProfesor() {
        acceso.cerrarConexion(conexion);
    }

    public Profesor buscarProfesor(int claveProfesor) {
        String queryBusqueda = "SELECT * FROM " + TABLA_PROFESOR + " WHERE " + COLUMNA_CLAVE_PROFESOR + " = " + claveProfesor;
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.first();
            if (resultado.getRow() != 0) {
                Profesor profesor = new Profesor();
                profesor.setClaveProfesor(resultado.getInt(1));
                profesor.setNombre(resultado.getString(2));
                profesor.setApellido(resultado.getString(3));
                profesor.setGradoAcademico(resultado.getString(4));
                return profesor;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n" + ex.toString());
            return null;
        }
    }

    public ArrayList<Profesor> buscarTodosLosProfesores() {
        String queryBusqueda = "SELECT * FROM " + TABLA_PROFESOR;
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.last();
            int resultSetSize = resultado.getRow();
            if (resultSetSize > 0) {
                ArrayList<Profesor> listaProfesores = new ArrayList<Profesor>();
                resultado.first();
                while (resultado.getRow() != 0) {//Mientras no se llegue a la ultima linea
                    Profesor actual = new Profesor();
                    actual.setClaveProfesor(resultado.getInt(1));
                    actual.setNombre(resultado.getString(2));
                    actual.setApellido(resultado.getString(3));
                    actual.setGradoAcademico(resultado.getString(4));
                    listaProfesores.add(actual);
                    resultado.next();
                }
                resultado.close();
                return listaProfesores;
            } else {
                ArrayList<Profesor> listaProfesores = new ArrayList<Profesor>();
                return listaProfesores;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n" + ex.toString());
            return null;
        }
    }

    public boolean existeProfesor(Profesor profesor) {
        String nombres = profesor.getNombre();
        String apellidos = profesor.getApellido();
        String gradoAcademico = profesor.getGradoAcademico();

        String queryBusqueda = "SELECT * FROM " + TABLA_PROFESOR
                + " WHERE " + COLUMNA_NOMBRE + " = '" + nombres
                + "' AND " + COLUMNA_APELLIDO + " = '" + apellidos
                + "' AND " + COLUMNA_GRADO_ACADEMICO + " = '" + gradoAcademico + "';";
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.first();
            if (resultado.getRow() == 0) {
                return false;
            } else {
                return true;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n" + ex.toString());
            return false;
        }
    }

    public boolean registrarProfesor(Profesor profesor) {
        try {
            String nombres = profesor.getNombre();
            String apellidos = profesor.getApellido();
            String gradoAcademico = profesor.getGradoAcademico();

            String queryInsercion = "INSERT INTO " + TABLA_PROFESOR + "("
                    + COLUMNA_NOMBRE + ", " + COLUMNA_APELLIDO + ", " + COLUMNA_GRADO_ACADEMICO + ") VALUES ('"
                    + nombres + "', '" + apellidos + "', '" + gradoAcademico + "');";

            Statement sentencia = acceso.crearSentenciaBD(conexion);
            sentencia.executeUpdate(queryInsercion);
            return true;

        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n" + ex.toString());
            return false;
        }
    }

    public boolean actualizarProfesor(Profesor profesor) {
        if(tieneLosMismosElementosDeDuplicidad(profesor)){
            return ejecutarActualizacionDeProfesor(profesor);            
        } else {            
            if (!existeProfesor(profesor)) {
                return ejecutarActualizacionDeProfesor(profesor);               
            } else {
               	return false;
            }
        }
    }

    public boolean eliminarProfesor(int claveProfesor) {
        try {
            String queryEliminacion = "DELETE FROM " + TABLA_PROFESOR + " WHERE "
                    + COLUMNA_CLAVE_PROFESOR + " = '" + claveProfesor + "';";
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            sentencia.executeUpdate(queryEliminacion);
            return true;
        } catch (SQLException ex) {            
            System.err.println("Problemas de SQL:\n" + ex.toString());            
            return false;
        }
    }

    private boolean tieneLosMismosElementosDeDuplicidad(Profesor profesorConNuevosDatos) {
        int claveProfesor = profesorConNuevosDatos.getClaveProfesor();

        Profesor profesorEncontrado = buscarProfesor(claveProfesor);

        if (profesorConNuevosDatos.getNombre().equals(profesorEncontrado.getNombre())
            && profesorConNuevosDatos.getApellido().equals(profesorEncontrado.getApellido())
            && profesorConNuevosDatos.getGradoAcademico().equals(profesorEncontrado.getGradoAcademico())) {
            return true;
        }
        return false;
    }
    
    private boolean ejecutarActualizacionDeProfesor(Profesor profesor){
        try {
            int claveProfesor = profesor.getClaveProfesor();
            String nombres = profesor.getNombre();
            String apellidos = profesor.getApellido();
            String gradoAcademico = profesor.getGradoAcademico();
            
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryUpdate = "UPDATE " + TABLA_PROFESOR + " SET " + 
                COLUMNA_NOMBRE + " = '" + nombres + "', " +
                COLUMNA_APELLIDO + " = '" + apellidos + "', " +
                COLUMNA_GRADO_ACADEMICO + " = '" + gradoAcademico + "'" +
                "WHERE " + COLUMNA_CLAVE_PROFESOR + " = '" + claveProfesor + "';";
            sentencia.executeUpdate(queryUpdate);
            return true;
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n" + ex.toString());
            return false;
        }
    }

    public Profesor buscarProfesor(Profesor prof) {
        if(this.existeProfesor(prof)){
            try{
                Statement sentencia = acceso.crearSentenciaBD(conexion);
                String queryBusqueda = "SELECT * FROM " + TABLA_PROFESOR
                + " WHERE " + COLUMNA_NOMBRE + " = '" + prof.getNombre()
                + "' AND " + COLUMNA_APELLIDO + " = '" + prof.getApellido()
                + "' AND " + COLUMNA_GRADO_ACADEMICO + " = '" + prof.getGradoAcademico() + "';";
                ResultSet resultado = sentencia.executeQuery(queryBusqueda);
             resultado.first();
            if (resultado.getRow() != 0) {
                Profesor profesor = new Profesor();
                profesor.setClaveProfesor(resultado.getInt(1));
                profesor.setNombre(resultado.getString(2));
                profesor.setApellido(resultado.getString(3));
                profesor.setGradoAcademico(resultado.getString(4));
                return profesor;
            } else {
                return null;
            }  
            }catch(SQLException ex){
                System.out.println("Problemas de SQL:\n"+ex.toString());
            }
        }
        return null;
    }
}
